package cn.getech.data.development.service;

import cn.getech.data.development.config.properties.DataDevelopmentConfig;
import cn.getech.data.development.dto.IdAndNameDto;
import cn.getech.data.development.entity.TableFieldInfo;
import cn.getech.data.development.entity.TableInfo;
import cn.getech.data.development.entity.TableRegisterEntity;
import cn.getech.data.development.entity.permission.TableInfoPermission;
import cn.getech.data.development.entity.permission.TenantTableInfoPermission;
import cn.getech.data.development.model.dto.TableAndConlumDto;
import cn.getech.data.development.model.dto.TableInfoAndFieldDto;
import cn.getech.data.development.model.dto.TableSqlDto;
import cn.getech.data.development.model.dto.UserAndTableDto;
import cn.getech.data.development.model.dto.real.RealApproveQueryDTO;
import cn.getech.data.development.model.dto.real.RealApproveReturnDTO;
import cn.getech.data.intelligence.common.utils.PageUtils;
import cn.getech.system.center.model.dto.RoleRowAndRoleDataPermissionDto;
import cn.getech.system.center.model.dto.RoleRowDataPermissionDto;
import cn.getech.system.center.model.dto.SysUserDto;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * <p>
 * 表信息 服务类
 * </p>
 *
 * @author zenith
 * @since 2018-09-18
 */
public interface TableInfoService extends IService<TableInfo> {
    PageUtils queryPage(Map<String, Object> params);

    PageUtils queryUserTablePage(Map<String, Object> params);

    List<Map<String,Object>> queryUserList(Map<String, Object> params);

    PageUtils<TableInfo> selectListPage(Map<String, Object> params);

    List<TableInfo> selectList(Map<String, Object> params);

    List<TableInfo> listTableByStorageEngine(Map<String, Object> params);

    boolean checkIfRef(Integer id);

    boolean checkExistByName(String dbName, String tableName);

    boolean checkPermission(Integer id);

    boolean checkExistById(Integer id);

    PageUtils<TableInfo> listNoRelation(Map<String, Object> params);

    /**
     * @Description 验证输出表是否有关联的分析任务
     * @Author hujz
     * @Date 2019/9/10 11:23
     * @Param id：输出表，仓库id  type:类型（1：删除  2：编辑）
     * @Return
     * @Exception
     */
    void checkedAnalysisInfo(Integer id, int type);

    List<Integer> getIdsByNames(List<String> tableNames, String dbName);


    /**
     * @Description  根据用户id和需要判断的表集合
     * @Author hujz
     * @Date 2019/12/19 11:47
     * @Param userId:用户id  tableIds:数据库id和名字的集合
     * @Return  List<TableAndConlumDto> 可以看到的表的集合
     * @Exception  如果表不是这个用户可以看到的表，则直接报错
     */
    List<TableAndConlumDto> getAllCoulonmsByUserId(Long userId, List<IdAndNameDto> tableIds) throws Exception;


    /***
     * 库表对应的显示权限
     * @param params
     * @param userId
     * @return
     */
    JSONArray roleAndPermission(Map<String, Object> params, Long userId);

    /***
     * 初始化 角色对应的库权限和表权限和字段权限
     * @param allDbIds
     * @param alltableIds
     * @param allConlumIds
     * @param roleRowDataPermissionDtos
     * @param sysUserDto
     */
    void initDbAndTableAndConlumIds(Set<Integer> allDbIds, Set<Integer> alltableIds, Set<Integer> allConlumIds, Set<RoleRowDataPermissionDto> roleRowDataPermissionDtos, SysUserDto sysUserDto);


    /***
     * 获取当前这个角色所配置的权限信息
     * @param allDbIds
     * @param alltableIds
     * @param allConlumIds
     * @param roleId
     */
    void initDbAndTableAndColumIds(Set<Integer> allDbIds, Set<Integer> alltableIds, Set<Integer> allConlumIds, Set<RoleRowDataPermissionDto> roleRowDataPermissionDtos,Long roleId);


    void initDbAndTable(Set<Integer> allDbIds,Set<Integer> allTableIds,Long roleId);

    void initDbAndTableAndColum(Set<Integer> allDbIds,Set<Integer> allTableIds,Set<Integer> allConlumIds,Long roleId);


    /***
     * 包装对应的用户可以可以看到和查询到的所有的表信息和字段信息
     * @param userIds
     */
    List<UserAndTableDto> packUserAndTableData(List<Long> userIds);


    /***
     * 封装可以看到这个表的所有的用户的数据
     * @param tableId 表id
     */
    List<UserAndTableDto> packUserAndTableData(Integer tableId);


    List<Long> packUserIdByTableId(Integer tableId);

    Boolean cheackDataPressionMenu(Integer id, Long userId);

    void selectByUserId(Long userId);

    List<TableInfo> selectListByDbNameAndTableName(String olderDbName, Set<String> tableNameSet);


    boolean tableOwner(Long uid, Integer tid);

    /***
     * 是否是查询自己的有权限的库和表
     * @param procId  项目内关联的表并且自己有权限的表
     * @return
     */
    JSONArray listDbsAndTables(Integer procId);

    void dropTables(String tableIds);

    /**
     * 获取数据规则使用到的表
     */
    List<TableInfo> selectTableByProc(String dbName,String tableName);

    /**
     * 获取用户参与的项目的表
     */
    List<TableInfo> selectUserProcTables(String dbName,Integer tableId);

    /**
     * 获取用户没有关联项目的表
     */
    List<TableInfo> selectUserNotProcTables(String dbName, Integer tableId);

    /**
     * 获取用户参与的项目的表以及用户创建未关联项目的表
     */
    List<TableInfo> selectTableByProcWithNoProc(String dbName, Integer tableId);

    /**
     * 获取存在分区字段的表
     *
     * @return
     */
    List<TableInfo> selectExitPartitionFieldTables();

    TableInfo getTableById(Integer tableId);

    /**
     * 根据角色查询数据权限信息
     */
    PageUtils listPageByRole(Map<String, Object> params);

    void setTenantParams(Map<String, Object> params,Integer datatype,Integer operation,Integer tenantId);

    /**
     * 保存数据仓库的表权限信息
     */
    void savePermission(List<TableInfoPermission> dataList);

    /**
     * 根据角色查询数据权限信息（租户下）
     */
    PageUtils listPageByTenant(Map<String, Object> params);

    /**
     * 保存数据仓库的表权限信息(租户下)
     */
    void saveTenantPermission(List<TenantTableInfoPermission> dataList);

    /**
     * 初始化表表权限权限 当前登录用户创建的表和字段 默认初始化当前登录用户的第一个角色的权限
     */
    void initDataPermission(Integer tableId,Long roleId,Integer userId);
    /**
     *  根据您数据权限查询表字段信息
     * @param dbNames  数据库名称
     * @param tableNames 表名称
     * @param operation 权限标识
     * @return 字段信息
     */
    List<TableFieldInfo> selectListByDbNamesAndTableNames(Set<String> dbNames, Set<String> tableNames, Integer operation);


    /**
     * 获取申请的数据仓库列表
     */
    JSONObject selectApplyListPage(Map<String, Object> params);

    /**
     *查询数据
     */
    PageUtils selectListOwnPage(Map<String, Object> params);

    /**
     *
     */
    TableInfo getDetailById(Integer id);

    void cheackTables(Integer id, Integer userId, Integer tenantId);

    void saveModelRelation(TableInfo tableInfo);

    /**
     * 我的授权列表 （实时表）
     * @param realApproveQueryDTO
     */
    IPage<RealApproveReturnDTO> realApproveList(Map<String, Object> params,RealApproveQueryDTO realApproveQueryDTO);

    IPage<RealApproveReturnDTO> realList(RealApproveQueryDTO realApproveQueryDTO);


    void delRealTable(Integer id);

    List<JSONObject> applyUserList(Integer id, Integer userId);

    List<JSONObject> createUserList(List<Integer> statusList, Map<String, Object> params);

    Boolean deleteDbTable(TableInfo tableInfo, List<TableRegisterEntity> registerEntityList, boolean falge);

    void addRegisterDelete(long startTime, List<TableRegisterEntity> registerEntityList, Integer importChangeRole);

    List<Long> selectTableIdByTableName(String relationTableName);

    void deleteDataQualityInfo(String dbName, String tableName);

    Boolean initKuduChange(List<TableFieldInfo> updateTableFields, List<TableFieldInfo> dropTableFields,
                           List<TableFieldInfo> addTableFields, List<TableFieldInfo> updateTablePros,
                           List<TableFieldInfo> tableFieldInfos, List<TableFieldInfo> olderTbaleFields);

    List<TableInfoAndFieldDto> initKuduSql(List<TableFieldInfo> updateTableFields, List<TableFieldInfo> dropTableFields,
                                           List<TableFieldInfo> addTableFields, List<TableFieldInfo> updateTablePros,
                                           TableInfo tableInfo);

    String rockKuduSql(TableSqlDto tableSqlDto);

    List<TableSqlDto> rockSteps(List<TableSqlDto> tmpTableSqlDtos, Integer isSteps);

    Boolean initKuduChangeSql(List<TableFieldInfo> updateTableFields, List<TableFieldInfo> dropTableFields,
                              List<TableFieldInfo> addTableFields, List<TableFieldInfo> updateTablePros,
                              List<TableFieldInfo> tableFieldInfos, List<TableFieldInfo> olderTbaleFields);

    List<Map<String, Object>> searchProjectList(Long userId);

    List<RoleRowAndRoleDataPermissionDto> selectTableFileRuleIds(Integer tableId);

    JSONArray listTreeNotField(Map<String, Object> params, Long userId);

    JSONArray listTreeField(Integer tableId, Long userId);

    Integer setCollectionTableId(Integer tableId, Integer collectionTableId);

    Integer deleteCategory(Integer tableId);

    Integer insertRelation(Map<String,Object> map);

    List<String> selectCategoryIdsByTableId(Integer tableId);

}
